home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / site1.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  30KB  |  1,156 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* site1.c */
  3. /* 1st half of site functions and aux functions to them */
  4.  
  5. #ifndef MSDOS
  6. #include <unistd.h>
  7. #endif
  8.  
  9. #include "glob.h"
  10.  
  11. /* the bank; can be broken into (!) */
  12. void l_bank()
  13. {
  14.   int done=FALSE,valid=FALSE;
  15.   long amount;
  16.   char response;
  17.   char passwd[64];
  18.   print1("First Bank of Omega: Autoteller Carrel.");
  19.  
  20.   if (gamestatusp(BANK_BROKEN))
  21.     print2("You see a damaged autoteller.");
  22.   else {
  23.     print2("The proximity sensor activates the autoteller as you approach.");
  24.     morewait();
  25.     while (! done) {
  26.       clearmsg();
  27.       print1("Current Balance: ");
  28.       mlongprint(Balance);
  29.       nprint1("Au. ");
  30.       nprint1(" Enter command (? for help) > ");
  31.       response = mgetc();
  32.       if (response == '?') {
  33.     menuclear();
  34.     menuprint("?: This List.\n");
  35.     if (strcmp(Password,"")==0)
  36.       menuprint("O: Open an account.\n");
  37.     else {
  38.       menuprint("P: Enter password.\n");
  39.       menuprint("D: Deposit.\n");
  40.       menuprint("W: Withdraw\n");
  41.     }
  42.     menuprint("X: eXit\n");
  43.     showmenu();
  44.     morewait();
  45.     xredraw();
  46.     continue;
  47.       }
  48.       else if ((response == 'P') && (strcmp(Password,"") != 0)) {
  49.     clearmsg();
  50.     print1("Password: ");
  51.     strcpy(passwd,msgscanstring());
  52.     valid = (strcmp(passwd,Password)==0);
  53.     if (! valid) {
  54.       done = TRUE;
  55.       menuclear();
  56.       menuprint("Alert! Alert! Invalid Password!\n");
  57.       menuprint("The police are being summoned!\n");
  58.       menuprint("Please wait for the police to arrive....\n\n");
  59.       menuprint("----Hit space bar to continue----\n");
  60.       showmenu();
  61.       response = menugetc();
  62.       if (response == ' ') {
  63.         Player.alignment += 5;
  64.         xredraw();
  65.         print1("Ah ha! Trying to rob the bank, eh?");
  66.         print2("Take him away, boys!");
  67.         morewait();
  68.         send_to_jail();
  69.       }
  70.       else {
  71.         Player.alignment -= 5;
  72.         menuclear();
  73.         sleep(4);
  74.         menuprint("^@^@^@^@^@00AD1203BC0F0000FFFFFFFFFFFF\n");
  75.         menuprint("Interrupt in _get_space. Illegal Character.\n");
  76.         showmenu();
  77.         sleep(4);
  78.         menuprint("Aborting _police_alert.....\n");
  79.         menuprint("Attempting reboot.....\n");
  80.         showmenu();
  81.         sleep(4);
  82.         menuprint("Warning: Illegal shmop at _count_cash.\n");
  83.         menuprint("Warning: Command Buffer NOT CLEARED\n");
  84.         showmenu();
  85.         sleep(4);
  86.         menuprint("Reboot Complete. Execution Continuing.\n");
  87.         menuprint("Withdrawing: 4294967297 Au.\n");
  88.         menuprint("Warning: Arithmetic Overflow in _withdraw\n");
  89.         showmenu();
  90.         sleep(4);
  91.         menuprint("Yo mama. Core dumped.\n");
  92.         showmenu();
  93.         sleep(4);
  94.         xredraw();
  95.         clearmsg();
  96.         print1("The cash machine begins to spew gold pieces!");
  97.         print2("You pick up your entire balance and then some!");
  98.         Player.cash += Balance + 1000 + random_range(3000);
  99.         Balance = 0;
  100.         setgamestatus(BANK_BROKEN);
  101.       }
  102.     }
  103.     else print2("Password accepted. Working.");
  104.       }
  105.       else if ((response == 'D') && valid) {
  106.     clearmsg();
  107.     print1("Amount: ");
  108.     amount = get_money(Player.cash);
  109.     if (amount < 1) 
  110.       print3("Transaction aborted.");
  111.     else if (amount > Player.cash)
  112.       print3("Deposit too large -- transaction aborted.");
  113.     else {
  114.       print2("Transaction accomplished.");
  115.       Balance += amount;
  116.       Player.cash -= amount;
  117.     }
  118.       }
  119.       else if ((response == 'W') && valid) {
  120.     clearmsg();
  121.     print2("Amount: ");
  122.     amount = get_money(Balance);
  123.     if (amount < 1) 
  124.       print3("Transaction aborted.");
  125.     else if (amount > Balance) 
  126.       print3("Withdrawal too large -- transaction aborted.");
  127.     else {
  128.       print2("Transaction accomplished.");
  129.       Balance -= amount;
  130.       Player.cash += amount;
  131.     }
  132.       }
  133.       else if (response == 'X') {
  134.     clearmsg();
  135.     print1("Bye!");
  136.     done = TRUE;
  137.       }
  138.       else if ((response == 'O') && (strcmp(Password,"")==0)) {
  139.     clearmsg();
  140.     print1("Opening new account.");
  141.     nprint1(" Please enter new password: ");
  142.     strcpy(Password,msgscanstring());
  143.     if (strcmp(Password,"")==0) {
  144.       print3("Illegal to use null password -- aborted.");
  145.       done = TRUE;
  146.     }
  147.     else {
  148.       print2("Password validated; account saved.");
  149.       valid = TRUE;
  150.     }
  151.       }
  152.       else print3(" Illegal command.");
  153.       dataprint();
  154.       morewait();
  155.     }
  156.   }
  157.   xredraw();
  158. }
  159.  
  160.  
  161.  
  162.  
  163. void l_armorer()
  164. {
  165.   int done = FALSE;
  166.   char action;
  167.   if (hour() == 12) 
  168.     print3("Unfortunately, this is Julie's lunch hour -- try again later.");
  169.   else if (nighttime()) 
  170.     print3("It seems that Julie keeps regular business hours.");
  171.   else {
  172.     while (! done) {
  173.       clearmsg();
  174.       print1("Julie's: Buy Armor, Weapons, or Leave [a,w,ESCAPE] ");
  175.       action = mgetc();
  176.       if (action == ESCAPE) 
  177.     done = TRUE;
  178.       else if (action == 'a') 
  179.     buyfromstock(ARMORID,10);
  180.       else if (action == 'w') 
  181.     buyfromstock(WEAPONID,23);
  182.     }
  183.   }
  184.   xredraw();
  185. }
  186.  
  187.  
  188. void buyfromstock(base,numitems)
  189. int base,numitems;  
  190. {
  191.   int i;
  192.   char item;
  193.   pob newitem;
  194.  
  195.   print2("Purchase which item? [ESCAPE to quit] ");
  196.   menuclear();
  197.   for(i=0;i<numitems;i++) {
  198.     strcpy(Str4," :");
  199.     Str4[0] = i + 'a';
  200.     strcat(Str4,Objects[base+i].objstr);
  201.     menuprint(Str4);
  202.     menuprint("\n");
  203.   }
  204.   showmenu();
  205.   item = ' ';
  206.   while ((item != ESCAPE) &&
  207.      ((item < 'a') || (item >= 'a'+numitems)))
  208.     item = mgetc();
  209.   if (item != ESCAPE) {
  210.     i = item - 'a';
  211.     newitem = ((pob) checkmalloc(sizeof(objtype)));
  212.     *newitem = Objects[base+i];
  213.     newitem->known = 2;
  214.     clearmsg();
  215.     print1("I can let you have it for ");
  216.     mlongprint(2*true_item_value(newitem));
  217.     nprint1("Au. Buy it? [yn] ");
  218.     if (ynq1() == 'y') {
  219.       if (Player.cash < 2*true_item_value(newitem)) {
  220.     print2("Why not try again some time you have the cash?");
  221.     free((char *) newitem);
  222.       }
  223.       else {
  224.     Player.cash -= 2*true_item_value(newitem);
  225.     dataprint();
  226.     gain_item(newitem);
  227.       }
  228.     }
  229.     else free((char *)newitem);
  230.   }
  231. }
  232.  
  233.  
  234. void l_club()
  235. {
  236. #define hinthour club_hinthour
  237.   char response;
  238.  
  239.   print1("Rampart Explorers' Club.");
  240.   if (! gamestatusp(CLUB_MEMBER)) {
  241.     if (Player.level < 2) print3("Only reknowned adventurers need apply.");
  242.     else {
  243.       print2("Dues are 100Au. Pay it? [yn] ");
  244.       if (ynq2()=='y') {
  245.     if (Player.cash < 100)
  246.       print3("Beat it, or we'll blackball you!");
  247.     else {
  248.       print1("Welcome to the club! You are taught the spell of Return.");
  249.           print2("When cast on the first level of a dungeon it");
  250.       morewait();
  251.       clearmsg();
  252.       print1("will transport you down to the lowest level");
  253.       print2("you have explored, and vice versa.");
  254.       Spells[S_RETURN].known = TRUE;
  255.       Player.cash -= 100;
  256.       setgamestatus(CLUB_MEMBER);
  257.     }
  258.       }
  259.       else print2("OK, but you're missing out on our benefits....");
  260.     }
  261.   }
  262.   else {
  263.     print2("Shop at the club store or listen for rumors [sl] ");
  264.     do response = (char) mcigetc(); 
  265.     while ((response != 's') && (response != 'l') && (response != ESCAPE));
  266.     if (response == 'l') {
  267.       if (hinthour == hour()) print2("You don't hear anything useful.");
  268.       else {
  269.     print1("You overhear a conversation....");
  270.     hint();
  271.     hinthour = hour();
  272.       }
  273.     }
  274.     else if (response == 's') {
  275.       buyfromstock(THINGID+7,2);
  276.       xredraw();
  277.     }
  278.     else if (response == ESCAPE)
  279.       print2("Be seeing you, old chap!");
  280.   }
  281. }
  282. #undef hinthour
  283.  
  284. void l_gym()
  285. {
  286.   int done=TRUE;
  287.   clearmsg();
  288.   do {
  289.     print1("The Rampart Gymnasium");
  290.     if ((Gymcredit > 0) || (Player.rank[ARENA])) {
  291.       nprint1("-- Credit: ");
  292.       mlongprint(Gymcredit);
  293.       nprint1("Au.");
  294.     }
  295.     done = FALSE;
  296.     menuclear();
  297.     menuprint("Train for 2000 Au. Choose:\n");
  298.     menuprint("\na: work out in the weight room");
  299.     menuprint("\nb: use our gymnastics equipment");
  300.     menuprint("\nc: take our new anaerobics course");
  301.     menuprint("\nd: enroll in dance lessons.");
  302.     menuprint("\nESCAPE: Leave this place.");
  303.     showmenu();
  304.     switch(mgetc()) {
  305.     case 'a': 
  306.       gymtrain(&(Player.maxstr),&(Player.str));
  307.       break;
  308.     case 'b': 
  309.       gymtrain(&(Player.maxdex),&(Player.dex));
  310.       break;
  311.     case 'c': 
  312.       gymtrain(&(Player.maxcon),&(Player.con));
  313.       break;
  314.     case 'd':
  315.       gymtrain(&(Player.maxagi),&(Player.agi));
  316.       break;
  317.     case ESCAPE:
  318.       clearmsg();
  319.       print1("Well, it's your body you're depriving!"); 
  320.       done = TRUE;
  321.       break;
  322.     }
  323.   } while (! done);
  324.   xredraw();
  325.   calc_melee();
  326. }
  327.  
  328.  
  329.  
  330. void l_healer()
  331. {
  332.   print1("Rampart Healers. Member RMA.");
  333.   morewait();
  334.   clearmsg();
  335.   print1("a: Heal injuries (50 crowns)");
  336.   print2("b: Cure disease (250 crowns)");
  337.   print3("ESCAPE: Leave these antiseptic alcoves.");
  338.   switch((char) mcigetc()) {
  339.     case 'a': healforpay(); break;
  340.     case 'b': cureforpay(); break;
  341.     default: print3("OK, but suppose you have Acute Satyriasis?"); break;
  342.   }          
  343. }
  344.  
  345.  
  346. void statue_random(x,y)
  347. int x,y;
  348. {
  349.   pob item;
  350.   int i,j;
  351.   switch(random_range(difficulty()+3)-1) {
  352.   default: l_statue_wake(); break;
  353.   case 0: 
  354.     print1("The statue crumbles with a clatter of gravel.");
  355.     Level->site[x][y].locchar = RUBBLE;
  356.     Level->site[x][y].p_locf = L_RUBBLE;
  357.     plotspot(x, y, TRUE);
  358.     lset(x, y, CHANGED);
  359.     break;
  360.   case 1: 
  361.     print1("The statue stoutly resists your attack.");
  362.     break;
  363.   case 2: 
  364.     print1("The statue crumbles with a clatter of gravel.");
  365.     Level->site[x][y].locchar = RUBBLE;
  366.     Level->site[x][y].p_locf = L_RUBBLE;
  367.     plotspot(x, y, TRUE);
  368.     lset(x, y, CHANGED);
  369.     make_site_treasure(x,y,difficulty());
  370.     break;
  371.   case 3:
  372.     print1("The statue hits you back!");
  373.     p_damage(random_range(difficulty()*5),UNSTOPPABLE,"a statue");
  374.     break;
  375.   case 4:
  376.     print1("The statue looks slightly pained. It speaks:");
  377.     morewait();
  378.     clearmsg();
  379.     hint();
  380.     break;
  381.   case 5:
  382.     if ((Current_Environment == Current_Dungeon) ||
  383.     (Current_Environment == E_CITY)) {
  384.       print1("You hear the whirr of some mechanism.");
  385.       print2("The statue glides smoothly into the floor!");
  386.       Level->site[x][y].locchar = STAIRS_DOWN;
  387.       Level->site[x][y].p_locf = L_NO_OP;
  388.       lset(x, y, CHANGED);
  389.     }
  390.     break;
  391.   case 6:
  392.     print1("The statue was covered with contact cement!");
  393.     print2("You can't move....");
  394.     Player.status[IMMOBILE]+=random_range(6)+2;
  395.     break;
  396.   case 7:
  397.     print1("A strange radiation emanates from the statue!");
  398.     dispel(-1);
  399.     break;
  400.   case 8: /* I think this is particularly evil. Heh heh. */
  401.     if (Player.possessions[O_WEAPON_HAND] != NULL) {
  402.       print1("Your weapon sinks deeply into the statue and is sucked away!");
  403.       item = Player.possessions[O_WEAPON_HAND];
  404.       conform_lost_object(Player.possessions[O_WEAPON_HAND]);
  405.       item->blessing = -1-abs(item->blessing);
  406.       drop_at(x,y,item);
  407.     }
  408.     break;
  409.   case 9:
  410.     print1("The statue extends an arm. Beams of light illuminate the level!");
  411.     for(i=0;i<WIDTH;i++)
  412.       for(j=0;j<LENGTH;j++) {
  413.     lset(i,j,SEEN);
  414.     if (loc_statusp(i,j,SECRET)) {
  415.       lreset(i,j,SECRET);
  416.       lset(i,j,CHANGED);
  417.     }
  418.       }
  419.     show_screen();
  420.     break;
  421.   }
  422. }
  423.  
  424. void l_statue_wake()
  425. {
  426.   int i;
  427.   int x=Player.x,y=Player.y;
  428.   for(i=0;i<9;i++)
  429.     wake_statue(x+Dirs[0][i],y+Dirs[1][i],TRUE);
  430. }
  431.  
  432. void wake_statue(x,y,first)
  433. int x,y,first;
  434. {
  435.   int i;
  436.   pml tml;
  437.   if (Level->site[x][y].locchar == STATUE) {
  438.     if (! first) mprint("Another statue awakens!");
  439.     else mprint("A statue springs to life!");
  440.     Level->site[x][y].locchar = FLOOR;
  441.     lset(x, y, CHANGED);
  442.     tml = ((pml) checkmalloc(sizeof(mltype)));
  443.     tml->m =
  444.       (Level->site[x][y].creature = m_create(x,y,0,difficulty()+1));
  445.     m_status_set(Level->site[x][y].creature,HOSTILE);
  446.     tml->next = Level->mlist;
  447.     Level->mlist = tml;
  448.     for(i=0;i<8;i++) wake_statue(x+Dirs[0][i],y+Dirs[1][i],FALSE);
  449.   }
  450. }
  451.  
  452.  
  453. void l_casino()
  454. {
  455.   int i,done = FALSE,a,b,c,match;
  456.   char response;
  457.   print1("Rampart Mithril Nugget Casino.");
  458.   if (random_range(10)==1)
  459.     print2("Casino closed due to Grand Jury investigation.");
  460.   else {
  461.     while (! done) {
  462.       morewait();
  463.       clearmsg();
  464.       print1("a: Drop 100Au in the slots.");
  465.       print2("b: Risk 1000Au  at roulette.");
  466.       print3("ESCAPE: Leave this green baize hall.");
  467.       response = (char) mcigetc();
  468.       if (response == 'a') {
  469.     if (Player.cash < 100) print3("No credit, jerk.");
  470.     else {
  471.       Player.cash -= 100;
  472.       dataprint();
  473.       for(i=0;i<20;i++) {
  474.         if (i==19)
  475.           sleep(1);
  476.         else
  477.           usleep(250000);
  478.         a = random_range(10);
  479.         b = random_range(10);
  480.         c = random_range(10);
  481.         clearmsg1();
  482.         mprint(slotstr(a));
  483.         mprint(slotstr(b));
  484.         mprint(slotstr(c));
  485.       }
  486.       if (winnings > 0) do {
  487.         a = random_range(10);
  488.         b = random_range(10);
  489.         c = random_range(10);
  490.       } while ((a==b) || (a == c) || (b == c));
  491.       else {
  492.         a = random_range(10);
  493.         b = random_range(10);
  494.         c = random_range(10);
  495.       }
  496.       clearmsg();
  497.       mprint(slotstr(a));
  498.       mprint(slotstr(b));
  499.       mprint(slotstr(c));
  500.       if ((a==b) && (a==c)) {
  501.         print3("Jackpot Winner!");
  502.         winnings += (a+2)*(b+2)*(c+2)*5;
  503.         Player.cash += (a+2)*(b+2)*(c+2)*5;
  504.         dataprint();
  505.       }
  506.       else if (a==b) {
  507.         print3("Winner!");
  508.         Player.cash += (a+2)*(b+2)*5;
  509.         dataprint();
  510.         winnings += (a+2)*(b+2)*5;
  511.       }
  512.       else if (a==c) {
  513.         print3("Winner!");
  514.         Player.cash += (a+2)*(c+2)*5;
  515.         dataprint();
  516.         winnings += (a+2)*(c+2)*5;
  517.       }
  518.       else if (c==b) {
  519.         print3("Winner!");
  520.         Player.cash += (c+2)*(b+2)*5;
  521.         dataprint();
  522.         winnings += (c+2)*(b+2)*5;
  523.       }
  524.       else {
  525.         print3("Loser!");
  526.         winnings -= 100;
  527.       }
  528.     }
  529.       }
  530.       else if (response == 'b') {
  531.     if (Player.cash < 1000) mprint("No credit, jerk.");
  532.     else {
  533.       Player.cash -= 1000;
  534.       dataprint();
  535.       print1("Red or Black? [rb]");
  536.       do response = (char) mcigetc();
  537.       while ((response != 'r') && (response != 'b'));
  538.       match = (response == 'r' ? 0 : 1);
  539.       for(i=0;i<20;i++) {
  540.         if (i==19)
  541.           sleep(1);
  542.         else
  543.           usleep(250000);
  544.         a = random_range(37);
  545.         b = a % 2;
  546.         if (a == 0) print1(" 0 ");
  547.         else if (a==1) print1(" 0 - 0 ");
  548.         else {
  549.           print1(( b == 0) ? "Red ": "Black ");
  550.           mnumprint(a-1);
  551.         }
  552.       }
  553.       if (winnings > 0) do {
  554.         a = random_range(37);
  555.         b = a % 2;
  556.       } while (b == match);
  557.       else {
  558.         a = random_range(37);
  559.         b = a % 2;
  560.       }
  561.       if (a == 0) print1(" 0 ");
  562.       else if (a==1) print1(" 0 - 0 ");
  563.       else {
  564.         print1((b == 0) ? "Red ": "Black ");
  565.         mnumprint(a-1);
  566.       }
  567.       if ((a > 1) && (b == match)){
  568.         print3(" Winner!");
  569.         winnings += 1000;
  570.         Player.cash += 2000;
  571.         dataprint();
  572.       }
  573.       else {
  574.         print3(" Loser!");
  575.         winnings -= 1000;
  576.         dataprint();
  577.       }
  578.     }
  579.       }
  580.       else if (response == ESCAPE) done = TRUE;
  581.     }
  582.   }
  583. }
  584.  
  585.  
  586.  
  587.  
  588.  
  589. void l_commandant()
  590. {
  591.   int num;
  592.   pob food;
  593.   print1("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs.");
  594.   print2("Buy a bucket! Only 5 Au. Make a purchase? [yn] ");
  595.   if (ynq2()=='y') {
  596.     clearmsg();
  597.     print1("How many? ");
  598.     num = (int) parsenum();
  599.     if (num < 1) print3("Cute. Real cute.");
  600.     else if (num*5 > Player.cash)
  601.       print3("No handouts here, mac!");
  602.     else {
  603.       Player.cash -= num*5;
  604.       food = ((pob) checkmalloc(sizeof(objtype)));
  605.       *food = Objects[FOODID+0]; /* food ration */
  606.       food->number = num;
  607.       if (num == 1)
  608.     print2("There you go, mac! One Lyzzard Bucket, coming up.");
  609.       else print2("A passel of Lyzzard Buckets, for your pleasure.");
  610.       morewait();
  611.       gain_item(food);
  612.     }
  613.   }
  614.   else print2("Don't blame the Commandant if you starve!");
  615. }
  616.  
  617.  
  618. void l_diner()
  619. {
  620.   print1("The Rampart Diner. All you can eat, 25Au.");
  621.   print2("Place an order? [yn] ");
  622.   if (ynq2()=='y') {
  623.     if (Player.cash < 25)
  624.       mprint("TANSTAAFL! Now git!");
  625.     else {
  626.       Player.cash -= 25;
  627.       dataprint();
  628.       Player.food = 44;
  629.       foodcheck();
  630.     }
  631.   }
  632. }
  633.  
  634. void l_crap()
  635. {
  636.   print1("Les Crapeuleaux. (****) ");
  637.   if ((hour() < 17) || (hour() > 23))
  638.     print2 ("So sorry, we are closed 'til the morrow...");
  639.   else {
  640.     print2("May I take your order? [yn] ");
  641.     if (ynq2()=='y') {
  642.       if (Player.cash < 1000)
  643.     print2("So sorry, you have not the funds for dinner.");
  644.       else {
  645.     print2("Hope you enjoyed your tres expensive meal, m'sieur...");
  646.     Player.cash -= 1000;
  647.     dataprint();
  648.     Player.food += 8;
  649.     foodcheck();
  650.       }
  651.     }
  652.   }
  653. }
  654.  
  655. void l_tavern()
  656. {
  657. #define hinthour tavern_hinthour
  658.   char response;
  659.   print1("The Centaur and Nymph -- J. Riley, prop.");
  660.   if (nighttime()) {
  661.     menuclear();
  662.     menuprint("Riley says: Whataya have?\n\n");
  663.     menuprint("a: Pint of Riley's ultra-dark 1Au\n");
  664.     menuprint("b: Shot of Tullimore Dew 10Au\n");
  665.     menuprint("c: Round for the House. 100Au\n");
  666.     menuprint("d: Bed and Breakfast. 25Au\n");
  667.     menuprint("ESCAPE: Leave this comfortable haven.\n");
  668.     showmenu();
  669.     do response = (char) mcigetc();
  670.     while ((response != 'a') &&
  671.        (response != 'b') &&
  672.        (response != 'c') &&
  673.        (response != 'd') &&
  674.        (response != ESCAPE));
  675.     switch (response) {
  676.     case 'a':
  677.       if (Player.cash < 1)
  678.     print2("Aw hell, have one on me.");
  679.       else {
  680.     hinthour = hour();
  681.     Player.cash -= 1;
  682.     dataprint();
  683.     if (hinthour!=hour()) {
  684.       if (random_range(3)) {
  685.         print1("You overhear a rumor...");
  686.         hint();
  687.       }
  688.       else print1("You don't hear much of interest.");
  689.       hinthour = hour();
  690.     }
  691.     else print1("You just hear the same conversations again.");
  692.       }
  693.       break;
  694.     case 'b':
  695.       if (Player.cash < 10)
  696.     print2("I don't serve the Dew on no tab, buddy!");
  697.       else {
  698.     Player.cash -= 10;
  699.     print1("Ahhhhh....");
  700.     if (Player.status[POISONED] || Player.status[DISEASED])
  701.       print2("Phew! That's, er, smooth stuff!");
  702.     Player.status[POISONED] = 0;
  703.     Player.status[DISEASED] = 0;
  704.     showflags();
  705.       }
  706.       break;
  707.     case 'c':
  708.       if (Player.cash < 100) {
  709.     print1("Whatta feeb!");
  710.     print2("Outta my establishment.... Now!");
  711.     p_damage(random_range(20),UNSTOPPABLE,"Riley's right cross");
  712.     morewait();
  713.       }
  714.       else {
  715.     Player.cash -= 100;
  716.     dataprint();
  717.     print1("'What a guy!'"); morewait();
  718.     print2("'Hey, thanks, fella.'"); morewait();
  719.     print3("'Make mine a double...'"); morewait();
  720.     clearmsg();
  721.     switch(random_range(4)) {
  722.     case 0:
  723.       print1("'You are a real pal. Say, have you heard.... ");
  724.       hint();
  725.       break;
  726.     case 1:
  727.       print1("A wandering priest of Dionysus blesses you...");
  728.       if ((Player.patron == ODIN) || (Player.patron == ATHENA))
  729.         Player.alignment++;
  730.       else if ((Player.patron == HECATE) || (Player.patron == SET))
  731.         Player.alignment--;
  732.       else if (Player.alignment > 0) Player.alignment--;
  733.       else Player.alignment++;
  734.       break;
  735.     case 2:
  736.       print1("A thirsty bard promises to put your name in a song!");
  737.       gain_experience(20);
  738.       break;
  739.     case 3:
  740.       print1("Riley draws you a shot of his 'special reserve'");
  741.       print2("Drink it [yn]?");
  742.       if (ynq2()=='y') {
  743.         if (Player.con < random_range(20)) {
  744.           print1("<cough> Quite a kick!");
  745.           print2("You feel a fiery warmth in your tummy....");
  746.           Player.con++;
  747.           Player.maxcon++;
  748.         }
  749.         else print2("You toss it back nonchalantly.");
  750.       }
  751.     }        
  752.       }
  753.       break;
  754.     case 'd':
  755.       if (Player.cash < 25)
  756.     print2("Pay in advance, mac!");
  757.       else {
  758.     Player.cash -= 25;
  759.     print2("How about a shot o' the dew for a nightcap?");
  760.     morewait();
  761.     Time += (6+random_range(4)) * 60;
  762.     Player.status[POISONED] = 0;
  763.     Player.status[DISEASED] = 0;
  764.     Player.food = 40;
  765.     /* reduce temporary stat gains to max stat levels */
  766.     toggle_item_use(TRUE);
  767.     Player.str = min(Player.str,Player.maxstr);
  768.     Player.con = min(Player.con,Player.maxcon);
  769.     Player.agi = min(Player.agi,Player.maxagi);
  770.     Player.dex = min(Player.dex,Player.maxdex);
  771.     Player.iq = min(Player.iq,Player.maxiq);
  772.     Player.pow = min(Player.pow,Player.maxpow);
  773.     toggle_item_use(FALSE);
  774.     timeprint();
  775.     dataprint();
  776.     showflags();
  777.     print1("The next day.....");
  778.     if (hour() > 10) print2("Oh my! You overslept!");
  779.       }
  780.       break;
  781.     default:
  782.       print2("So? Just looking? Go on!");
  783.       break;
  784.     }
  785.   }
  786.   else print2("The pub don't open til dark, fella.");
  787.   xredraw();
  788. }
  789. #undef hinthour
  790.  
  791.  
  792. void l_alchemist()
  793. {
  794.   int i,done=FALSE,mlevel;
  795.   char response;
  796.   pob obj;
  797.   print1("Ambrosias' Potions et cie.");
  798.   if (nighttime()) 
  799.     print2("Ambrosias doesn't seem to be in right now.");
  800.   else while (! done){
  801.     morewait();
  802.     clearmsg();
  803.     print1("a: Sell monster components.");
  804.     print2("b: Pay for transformation.");
  805.     print3("ESCAPE: Leave this place.");
  806.     response = (char) mcigetc();
  807.     if (response == 'a') {
  808.       clearmsg();
  809.       done = TRUE;
  810.       i = getitem(CORPSE);
  811.       if ((i != ABORT) && (Player.possessions[i] != NULL)){
  812.     obj = Player.possessions[i];
  813.     if (Monsters[obj->charge].transformid == -1) {
  814.       print1("I don't want such a thing.");
  815.       if (obj->basevalue > 0)
  816.         print2("You might be able to sell it to someone else, though.");
  817.     }
  818.     else {
  819.       clearmsg();
  820.       print1("I'll give you ");
  821.       mnumprint(obj->basevalue/3);
  822.       nprint1("Au for it. Take it? [yn] ");
  823.       if (ynq1()=='y') {
  824.         Player.cash += (obj->basevalue/3);
  825.         conform_lost_objects(1,obj);
  826.       }
  827.       else print2("Well, keep the smelly old thing, then!");
  828.     }
  829.       }
  830.       else print2("So nu?");
  831.     }
  832.     else if (response == 'b') {
  833.       clearmsg();
  834.       done = TRUE;
  835.       i = getitem(CORPSE);
  836.       if ((i != ABORT) && (Player.possessions[i] != NULL)){
  837.     obj = Player.possessions[i];
  838.     if (Monsters[obj->charge].transformid == -1)
  839.       print1("Oy vey! You want me to transform such a thing?");
  840.     else {
  841.       mlevel = Monsters[obj->charge].level;
  842.       print1("It'll cost you ");
  843.       mnumprint(max(10,obj->basevalue*2));
  844.       nprint1("Au for the transformation. Pay it? [yn] ");
  845.       if (ynq1()=='y') {
  846.         if (Player.cash < max(10,obj->basevalue*2))
  847.           print2("You can't afford it!");
  848.         else {
  849.           print1("Voila! A tap of the Philosopher's Stone...");
  850.           Player.cash -= max(10,obj->basevalue*2);
  851.           *obj = Objects[Monsters[obj->charge].transformid];
  852.           if ((obj->id >= STICKID) && (obj->id < STICKID+NUMSTICKS))
  853.         obj->charge = 20;
  854.           if (obj->plus == 0) obj->plus = mlevel;
  855.           if (obj->blessing == 0) obj->blessing = 1;
  856.         }
  857.       }
  858.       else print2("I don't need your business, anyhow.");
  859.     }
  860.       }
  861.       else print2("So nu?");
  862.     }
  863.     else if (response == ESCAPE) done = TRUE;
  864.   }
  865. }
  866.  
  867. void l_dpw()
  868. {
  869.   print1("Rampart Department of Public Works.");
  870.   if (Date - LastDay < 7)
  871.     print2("G'wan! Get a job!");
  872.   else if (Player.cash < 100) {
  873.     print2("Do you want to go on the dole? [yn] ");
  874.     if (ynq2()=='y') {
  875.       print1("Well, ok, but spend it wisely.");
  876.       print2("Please enter your name for our records.");
  877.       if (strcmp(Player.name,msgscanstring()) != 0) {
  878.     print3("Aha! Welfare Fraud! It's off to gaol for you, lout!");
  879.     morewait();
  880.     send_to_jail();
  881.       }
  882.       else {
  883.     print1("Here's your handout, layabout!");
  884.     LastDay = Date;
  885.     Player.cash = 99;
  886.     dataprint();
  887.       }
  888.     }
  889.   }
  890.   else print2("You're too well off for us to help you!");
  891. }
  892.  
  893. void l_library()
  894. {
  895.   char response;
  896.   int done=FALSE,fee = 1000;
  897.   print1("Rampart Public Library.");
  898.   if (nighttime())
  899.     print2("CLOSED");
  900.   else {
  901.     morewait();
  902.     print1("Library Research Fee: 1000Au.");
  903.     if (Player.maxiq < 18) {
  904.       print2("The Rampart student aid system has arranged a grant!");
  905.       morewait();
  906.       clearmsg();
  907.       print1("Your revised fee is: ");
  908.       mnumprint(fee=max(50,1000-(18-Player.maxiq)*125));
  909.       nprint1("Au.");
  910.     }
  911.     morewait();
  912.     while(! done) {
  913.       print1("Pay the fee? [yn] ");
  914.       if (ynq1()=='y') {
  915.     if (Player.cash < fee) {
  916.       print2("No payee, No studee.");
  917.       done = TRUE;
  918.     }
  919.     else {
  920.       Player.cash -= fee;
  921.       dataprint();
  922.       menuclear();
  923.       menuprint("Peruse a scroll:\n");
  924.       menuprint("a: Omegan Theology\n");
  925.       menuprint("b: Guide to Rampart\n");
  926.       menuprint("c: High Magick\n");
  927.       menuprint("d: Odd Uncatalogued Document\n");
  928.       menuprint("e: Attempt Advanced Research\n");
  929.       menuprint("ESCAPE: Leave this font of learning.\n");
  930.       showmenu();
  931.       response = (char) mcigetc();
  932.       if (response == 'a') {
  933.         print1("You unfurl an ancient, yellowing scroll...");
  934.         morewait();
  935.         theologyfile();
  936.       }
  937.       else if (response == 'b') {
  938.         print1("You unroll a slick four-color document...");
  939.         morewait();
  940.         cityguidefile();
  941.       }
  942.       else if (response == 'c') {
  943.         print1("This scroll is written in a strange magical script...");
  944.         morewait();
  945.         wishfile();
  946.       }
  947.       else if (response == 'd') {
  948.         print1("You find a strange document, obviously misfiled");
  949.         print2("under the heading 'acrylic fungus painting technique'");
  950.         morewait();
  951.         adeptfile();
  952.       }
  953.       else if (response == 'e') {
  954.         if (random_range(30) > Player.iq)  {
  955.           print2("You feel more knowledgeable!");
  956.           Player.iq++;
  957.           Player.maxiq++;
  958.           dataprint();
  959.           if (Player.maxiq < 19 &&
  960.         fee != max(50,1000-(18-Player.maxiq)*125))
  961.         {
  962.           morewait();
  963.           clearmsg();
  964.           print1("Your revised fee is: ");
  965.           mnumprint(fee=max(50,1000-(18-Player.maxiq)*125));
  966.           nprint1("Au.");
  967.           morewait();
  968.         }
  969.         }
  970.         else {
  971.           clearmsg1();
  972.           print1("You find advice in an ancient tome: ");
  973.           morewait();
  974.           hint();
  975.           morewait();
  976.         }
  977.       }
  978.       else done = (response == ESCAPE);
  979.     }
  980.       xredraw();
  981.       }
  982.       else {
  983.     done = TRUE;
  984.     print2("You philistine!");
  985.       }
  986.     }
  987.   }
  988. }
  989.  
  990.  
  991. void l_pawn_shop()
  992. {
  993.   int i,j,k,limit,number,done = FALSE;
  994.   char item,action;
  995.  
  996.   if (nighttime())
  997.     print1("Shop Closed: Have a Nice (K)Night");
  998.   else {
  999.     limit = min(5,Date-Pawndate);
  1000.     Pawndate = Date;
  1001.     for(k=0;k<limit;k++) {
  1002.       if (Pawnitems[0] != NULL) {
  1003.     if (Objects[Pawnitems[0]->id].uniqueness > UNIQUE_UNMADE)
  1004.       Objects[Pawnitems[0]->id].uniqueness = UNIQUE_UNMADE;
  1005.       /* could turn up anywhere, really :) */
  1006.     free((char *) Pawnitems[0]);
  1007.     Pawnitems[0] = NULL;
  1008.       }
  1009.       for (i=0;i<PAWNITEMS-1;i++)
  1010.     Pawnitems[i] = Pawnitems[i+1];
  1011.       Pawnitems[PAWNITEMS-1] = NULL;
  1012.       for (i=0;i<PAWNITEMS;i++)
  1013.      if (Pawnitems[i] == NULL)
  1014.           do {
  1015.             if (Pawnitems[i] != NULL)
  1016.               free(Pawnitems[i]);
  1017.             do Pawnitems[i] = create_object(5);
  1018.             while (!Pawnitems[i]);
  1019.             Pawnitems[i]->known = 2;
  1020.           } while ((Pawnitems[i]->objchar == CASH) ||
  1021.                    (Pawnitems[i]->objchar == ARTIFACT) ||
  1022.                    (true_item_value(Pawnitems[i]) <= 0));
  1023.     }
  1024.     while (! done) {
  1025.       print1("Knight's Pawn Shop:");
  1026.       print2("Buy item, Sell item, sell Pack contents, Leave [b,s,p,ESCAPE] ");
  1027.       menuclear();
  1028.       for(i=0;i<PAWNITEMS;i++) 
  1029.     if (Pawnitems[i] != NULL) {
  1030.       strcpy(Str3," :");
  1031.       Str3[0] = i+'a';
  1032.       strcat(Str3,itemid(Pawnitems[i]));
  1033.       menuprint(Str3);
  1034.       menuprint("\n");
  1035.     }
  1036.       showmenu();
  1037.       action = (char) mcigetc();
  1038.       if (action == ESCAPE) 
  1039.     done = TRUE;
  1040.       else if (action == 'b') {
  1041.     print2("Purchase which item? [ESCAPE to quit] ");
  1042.     item = ' ';
  1043.     while ((item != ESCAPE) &&
  1044.            ((item < 'a') || (item >= 'a' + PAWNITEMS)))
  1045.       item = (char) mcigetc();
  1046.     if (item != ESCAPE) {
  1047.       i = item - 'a';
  1048.       if (Pawnitems[i] == NULL) print3("No such item!");
  1049.       else if (true_item_value(Pawnitems[i]) <= 0) {
  1050.         print1("Hmm, how did that junk get on my shelves?");
  1051.         print2("I'll just remove it.");
  1052.         free((char *) Pawnitems[i]);
  1053.         Pawnitems[i] = NULL;
  1054.       }
  1055.       else {
  1056.         clearmsg();
  1057.         print1("The low, low, cost is: ");
  1058.         mlongprint(Pawnitems[i]->number*true_item_value(Pawnitems[i]));
  1059.         nprint1(" Buy it? [ynq] ");
  1060.         if (ynq1() == 'y') {
  1061.           if (Player.cash < 
  1062.           Pawnitems[i]->number *
  1063.           true_item_value(Pawnitems[i])) {
  1064.         print2("No credit! Gwan, Beat it!");
  1065.         morewait();
  1066.           }
  1067.           else {
  1068.         Player.cash -= 
  1069.           Pawnitems[i]->number*
  1070.             true_item_value(Pawnitems[i]);
  1071.         Objects[Pawnitems[i]->id].known = 1;
  1072.         gain_item(Pawnitems[i]);
  1073.         Pawnitems[i] = NULL;
  1074.           }
  1075.         }
  1076.       }
  1077.     }
  1078.       }
  1079.       else if (action == 's') {
  1080.     menuclear();
  1081.     print2("Sell which item: ");
  1082.     i = getitem(NULL_ITEM);
  1083.     if ((i != ABORT) && (Player.possessions[i] != NULL)) {
  1084.       if (cursed(Player.possessions[i])) {
  1085.         print1("No loans on cursed items! I been burned before....");
  1086.         morewait();
  1087.       }
  1088.       else if (true_item_value(Player.possessions[i]) <= 0) {
  1089.         print1("That looks like a worthless piece of junk to me.");
  1090.         morewait();
  1091.       }
  1092.       else {
  1093.         clearmsg();
  1094.         print1("You can get ");
  1095.         mlongprint(item_value(Player.possessions[i]) / 2);
  1096.         nprint1("Au each. Sell [yn]? ");
  1097.         if (ynq1() == 'y') {
  1098.           number = getnumber(Player.possessions[i]->number);
  1099.           if ((number >= Player.possessions[i]->number) &&
  1100.           Player.possessions[i]->used) {
  1101.         Player.possessions[i]->used = FALSE;
  1102.         item_use(Player.possessions[i]);
  1103.           }
  1104.           Player.cash += number * item_value(Player.possessions[i]) / 2;
  1105.           free((char *) Pawnitems[0]);
  1106.           for(j=0;j<PAWNITEMS - 1;j++)
  1107.         Pawnitems[j] = Pawnitems[j+1];
  1108.           Pawnitems[PAWNITEMS - 1] = ((pob) checkmalloc(sizeof(objtype)));
  1109.           *(Pawnitems[PAWNITEMS - 1]) = *(Player.possessions[i]);
  1110.           Pawnitems[PAWNITEMS - 1]->number = number;
  1111.           Pawnitems[PAWNITEMS - 1]->known = 2;    
  1112.           dispose_lost_objects(number,Player.possessions[i]);
  1113.           dataprint();
  1114.         }
  1115.       }
  1116.     }
  1117.       }
  1118.       else if (action == 'p') {
  1119.     for(i=0;i<Player.packptr;i++) {
  1120.       if (Player.pack[i]->blessing > -1 &&
  1121.           true_item_value(Player.pack[i]) > 0) {
  1122.         clearmsg();
  1123.         print1("Sell ");
  1124.         nprint1(itemid(Player.pack[i]));
  1125.         nprint1(" for ");
  1126.         mlongprint(item_value(Player.pack[i])/2);
  1127.         nprint1("Au each? [yn] ");
  1128.         if (ynq1()=='y') {
  1129.           number = getnumber(Player.pack[i]->number);
  1130.           if (number > 0) {
  1131.         Player.cash += number * item_value(Player.pack[i]) / 2;
  1132.         free((char *) Pawnitems[0]);
  1133.         for(j=0;j<PAWNITEMS - 1;j++)
  1134.           Pawnitems[j] = Pawnitems[j+1];
  1135.         Pawnitems[PAWNITEMS - 1] = ((pob) checkmalloc(sizeof(objtype)));
  1136.         *(Pawnitems[PAWNITEMS - 1]) = *(Player.pack[i]);
  1137.         Pawnitems[PAWNITEMS - 1]->number = number;
  1138.         Pawnitems[PAWNITEMS - 1]->known = 2;
  1139.         Player.pack[i]->number -= number;
  1140.         if (Player.pack[i]->number < 1) {
  1141.           free((char *)Player.pack[i]);
  1142.           Player.pack[i] = NULL;
  1143.         }
  1144.         dataprint();
  1145.           }
  1146.         }
  1147.       }
  1148.     }
  1149.     fixpack();
  1150.       }
  1151.     }
  1152.   }
  1153.   calc_melee();
  1154.   xredraw();
  1155. }
  1156.